/*
 * fMatrix.h
 *
 *  Created on: Jun 26, 2013
 *      Author: koldar
 */

#ifndef FMATRIX_H_
#define FMATRIX_H_

#include <stdio.h>
#include "edgeID.h"

/**rappresenta quante volte un arco è stato in soluzione da un particolare camion
 *
 */
typedef struct FMatrix {
	/**una matrice che indica ogni arco quante volte è comparso nelle soluzioni STM*/
	int** matrix;
	/**un puntatore ad una cella di memoria contenente il numero di vertici del grafo*/
	int* N;
	/**indica il minimo valore contenuto nella matrice. Viene modificato automaticamente e quindi non <b>deve</b> essere modificato.*/
	int minimum;
	/**indica il numero di minimi all'interno della matrice. Viene modificato automaticamente e quindi non <b>deve</b> essere modificato manualmente*/
	int minimumNumber;
} FMatrix;

/**puntatore di servizio*/
typedef FMatrix* PfMatrix;

/**costruisce una nuova istanza di FMatrix
 *
 * \pre
 *  \li N non NULL
 *  \li N non contiene un valore negativo o nullo
 * \post
 *  \li una nuova istanza di FMatrix è allocata in memoria. Deve essere deallocata <b>manualmente</b>
 *  \li la matrice e' inizializzata a valori 0
 *  \li il campo minimo è inizializzato a valore 0
 *
 * @param N una cella di memoria in cui e' contenuto i valore del numero di nodi del grafo
 * @return un puntatore ad una nuova istanza di FMatrix
 */
PfMatrix initFMatrix(int* N);

/**dealloca un oggetto di tipo FMatrix dalla memoria, liberandola
 *
 * \pre
 *  \li obj non NULL
 * \post
 *  \li la memoria viene liberata dall'oggetto
 *  \li la cella puntata da N <b>non</b> viene alterata
 *
 * @param obj l'oggetto da deallocare
 */
void freeFMatrix(PfMatrix obj);

/**stampa la matrice delle frequenze
 *
 * \pre
 *  \li f aperto in scrittura
 *  \li pmatrix non NULL
 *  \li f non NULL
 * \post
 *  \li il file f viene modificato
 *
 * @param f il file su cui scrivere la matrice
 * @param pmatrix la matrice da stampare
 */
void printFMatrix(FILE* f,PfMatrix pmatrix);

/**imposta il valore all'interno della matrice puntato da pid a quello passato come parametro. E' <b>altamente consigliato</b>
 * utilizzare questa funzione per impostare valori nella matrice.
 *
 * \pre
 *  \li pid non NULL
 *  \li pid validato
 *  \li pmatrix non NULL
 *  \li pid puntante una zona in matrice esistente
 *  \li value positivo o 0
 * \post
 *  \li pmatrix@pid=value
 *  \li campo minimum aggiornato correttamente
 *  \li campo minimumNumber aggiornato correttamente
 *
 * @param pid l'ID dell'arco da modificare
 * @param pmatrix la matrice da modificare
 * @param value il valore da inserire nella matrice
 */
void setFMatrixValue(PedgeID pid,PfMatrix pmatrix,int value);

/**funzione usata per reperire valori dalla matrice FMatrix
 *
 * \pre
 *  \li pid non NULL
 *  \li pid validato
 *  \li cella della matrice puntata da pid esistente
 *  \li pmatrix non NULL
 *
 * @param pid l'arco di cui reperire la frequenza
 * @param pmatrix la matrice per cui attuare il get
 * @return la frequenza dell'arco
 */
int getFMatrixValue(PedgeID pid,PfMatrix pmatrix);

/**somma il valore all'interno della matrice puntato da pid con quello passato come parametro. E' <b>altamente consigliato</b>
 * utilizzare questa funzione per aggiornare valori nella matrice.
 *
 * \pre
 *  \li pid non NULL
 *  \li pid validato
 *  \li pmatrix non NULL
 *  \li pid puntante una zona in matrice esistente
 * \post
 *  \li pmatrix@pid=value o se minore di zero, zero
 *  \li campo minimum aggiornato correttamente
 *
 * @param pid l'ID dell'arco da modificare
 * @param pmatrix la matrice da modificare
 * @param value il valore da sommare al valore contenuto nella matrice
 */
void addFMatrixValue(PedgeID pid,PfMatrix pmatrix,int value);

#endif /* FMATRIX_H_ */
